package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * 标准流：IO流处理异常对象
 *
 * 高级流：BufferOutputStream 缓冲输出流 写 bos.txt
 *        BufferInputStream 缓冲输入流 读入
 */
public class IOSAPI {
    /**
     * 缓冲输入流:构造器-->异常对象
     * 字符流【转换流】---解决:缓冲输入流读取单位 为字节问题
     * InputStreamReader 读取单位：字符
     * OutputStreamWriter 写出单位：字符 调用字符串getBytes写出文本
     * 构造器具备：添加字符集：UTF8万国码
     * new BufferedOutputStream(低级里引用，size：存字节数组【指定】)
     * 问题1：不能指定字符集
     *    2：不能按照字符读取
     */
    @Test
    public void testBIS() throws FileNotFoundException {
        //标准流：1.置空流
        FileInputStream fis=null;
        OutputStreamWriter osw=null;
        //标准流：2.捕获异常
        //创建低级流
        fis=
                new FileInputStream("bos.txt");
        BufferedInputStream bos=
                new BufferedInputStream(fis);
        //创建低级流
       // FileOutputStream fis=
                new FileOutputStream("osw.txt");
        //不考虑效率---只传输文本---字符输出流：输出单位字符形式
        //字符流：都可以在构造器里第二个参数指定编码集
        //OutputStreamWriter osw=
          //      new OutputStreamWriter(fos,"UTF8");
        //write() 直接写出文本【不需要将文本转换为字节数组】
        //osw.write("王源最帅");
        //osw.write("彩虹云朵");
        //osw.write("流行也为你落下来了");

        /**
         * read()----读：一个字节，字节数组---->专门读文字
         */


    }
    /**
     * 高级流
     *针对于缓冲输出/入功能上的限定
     *
     * 字符流【转换流】---解决：缓冲输入流读取单位 为字节问题
     * InputStreamReader 读取单位：字符
     * OutPutStreamWriter 写出单位：字符 调用字符串getBytes
     * 需求：重新写流----针对：文字 写出文本：osw.txt
     */
    @Test
    public void testOSW()  {
        //创建低级流
        FileOutputStream fos=null;
        //不考虑效率---只传输文本---字符输出流：输出单位字符形式

            //字符流：都可以在构造器里第二个参数指定编码集

        OutputStreamWriter osw=null;
        try {
            fos=new FileOutputStream("ost.txt");

            osw=new OutputStreamWriter(fos,"UTF8");
            //write() 直接写出文本【不需要将文本转换为字节数组】
            osw.write("王源");
            osw.write("世界");
            osw.write("第一帅");
        } catch (UnsupportedEncodingException e) { //文件不存在
            e.printStackTrace();
        } catch (FileNotFoundException e) { //文件不存在
            e.printStackTrace();
        } catch (IOException e) { //文件不存在
            e.printStackTrace();
        } finally {
            //关闭高级流：字符输出流
           if (osw!=null);
            try {
                osw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
    /**
     * 高级流【处理器】---转换流，特点：套在低级流上，被其他高级流套上【传输单位：字符】
     * 字符输入流 --- 单元测试：testISR() 读入 文本【字符串？】
     * 字符输出流 --- 单元测试：testOSW() 写出 文本【字符串】
     * InputStreamReader
     * 需求：ISR字符输入流读取 osw.txt 文件
     * 当前代码转换为标准流IO：捕获所有异常
     * 读取每行文本？ readLine() 提示：不为null代表文本写出
     * 写出：给老铁来个双击~~666 参考：CV复制粘贴
     *      777
     */
    @Test
    public void testISR() throws IOException {
        //创建低级流
        FileInputStream fis=new FileInputStream("osw.txt");
        //创建高级流---转换流--字符输入流
        InputStreamReader isr=new InputStreamReader(fis);
        //读 read() 问题：读入数据单位：字节，而不是字符，读字符
        //               转换流---套高级流：缓冲字符输入/出流
        //创建高级流---针对转换流中：字符输入流无法读取形式
        //                       字符的情况--缓冲字符输入流
        BufferedReader br=new BufferedReader(isr);
        /**BufferedReader 类
         *readLine() 读入若干字符串，直到读到没有换行符为止
         */
        //接受输出字符串
        String line=null;
        //判断条件：文本中一直有内容，一直读 一行文本
        // (line= br.readLine())!=null 一行文本
        while ((line= br.readLine())!=null){
            System.out.println("打印读到字符串："+line);
        }
    }
    /**
     * 作业2：读取IOSAPI.java文件---所有代码--写出控制台
     */
    @Test
    public void testHomeWork2() throws IOException {
        //1.创建低级流----读入--找IOSAPI.java 代表路径：File.separator
        //路径：src\main\java\com\tedu\api\io\IOSAPI.java
        FileInputStream fis=new FileInputStream("src"+File.separator+"main"+File.separator+"java"+File.separator+"com"+File.separator+"tedu"+File.separator+"api"+File.separator+"io"+File.separator+"IOSAPI.java");
        //2.创建高级流---【读入内容是文本】---转换流--无法读取文本【int】
        InputStreamReader isr=new InputStreamReader(fis);
        //3创建高级流---缓冲输入流---读取文本
        BufferedReader br=new BufferedReader(isr);
        //4.创建变量：字符串类型--保存每次读取的一行文本
        String line=null; //null代表没有内容【等同于换行】

        //5.一直读入：每行文本保存line中，如果line不为null，一直读
        while ((line=br.readLine())!=null){
            System.out.println("打印字符串"+line);
        }
        //6.关闭高级流
        br.close();
    }
    /**
     * BufferedWriter---低配版输出流【缓冲输出流】
     * PrintWriter---高配版本输出流【字符输出流】
     * 1.高级流不能直接创建----直接创建【不需要创建低级流】--封装
     * 2.封装内存所有流的特点
     * 需求：写出文件pw.txt---文本内容，需要指定编码集：UTF8
     */
    @Test
    public void testPW() throws FileNotFoundException, UnsupportedEncodingException {
        //低级流:输出流
        FileOutputStream fos=new FileOutputStream("pw.txt");
        //高级流：转换流，功能：指定编码集
        OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF8");
        //高级流：缓冲流，功能：提高效率
        BufferedWriter bw=new BufferedWriter(osw);
        //创建高级流：低级流+转换流+缓冲流
        PrintWriter pw=new PrintWriter("pw.txt","UTF8");
        //写出功能：print()  打印一行文本 不换行
        //        print()  打印一行文本 换行
        pw.print("王源");
        pw.println("宇宙第一可爱");
        pw.close();
    }

}
